package com.Shuang.Demo5;

/*
* 给你一个按照非递减顺序排列的整数数组 `nums`，和一个目标值 `target`。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 `target`，返回 `[-1, -1]`。

**注意：杂必须确保程序的时间复度是o(log2n)，否则不给分数**

**具体功能点的要求如下：**
*
数组 nums = [5,7,7,8,8,10], target = 8
得到结果是：[3,4]
```
数组：nums = [5,7,7,8,8,10], target = 6
得到结果是：[-1,-1]
```
数组：nums = [], target = 0
得到结果是：[-1,-1]
```
请设计一个方法完成以上需求，并编写测试代码完成上述测试。
*
* */
public class Test {
    public static void main(String[] args) {

        int[] nums = {5,7,7,8,8,10};
        int target = 8;

        int leftIndex = getIndex(nums, target,true);
        int rightIndex = getIndex(nums, target,false);
        print(leftIndex, rightIndex);
    }

    //按示例格式打印方法
    private static void print(int leftIndex, int rightIndex) {
        System.out.println("[" + leftIndex + ", " + rightIndex + "]");
    }

    //两个索引方法大部分重复，将两个得到索引方法合在一起
    public static int getIndex(int[] nums, int target, boolean leftFlag){
        int startIndex = 0;
        int endIndex = nums.length - 1;
        int rs = -1;  //用于记录左边索引位置 没找到就是-1

        while (startIndex <= endIndex){
            int middle = (startIndex + endIndex) / 2;
            if (target > nums[middle]){
                startIndex = middle + 1;
            }else if (target < nums[middle]){
                endIndex = middle - 1;
            }else {
                rs = middle;
                if (leftFlag){  //往左边找
                    endIndex = middle - 1;
                }else {  //往右边找
                    startIndex = middle + 1;
                }
            }
        }
        return rs;
    }

//    //得到右边索引的方法
//    private static int getRightIndex(int[] nums, int target) {
//        int startIndex = 0;
//        int endIndex = nums.length - 1;
//        int rs = -1;  //用于记录右边索引位置 没找到就是-1
//
//        while (startIndex <= endIndex){
//            int middle = (startIndex + endIndex) / 2;
//            if (target > nums[middle]){
//                startIndex = middle + 1;
//            }else if (target < nums[middle]){
//                endIndex = middle - 1;
//            }else {
//                rs = middle;
//                //还要再往右边再找一下，第一次中间位置不一定是最右边的位置
//                startIndex = middle + 1;
//            }
//        }
//        return rs;
//    }
//
//    //得到目标值左边索引的方法
//    public static int getLeftIndex(int[] nums, int target){
//        int startIndex = 0;
//        int endIndex = nums.length - 1;
//        int rs = -1;  //用于记录左边索引位置 没找到就是-1
//
//        while (startIndex <= endIndex){
//            int middle = (startIndex + endIndex) / 2;
//            if (target > nums[middle]){
//                startIndex = middle + 1;
//            }else if (target < nums[middle]){
//                endIndex = middle - 1;
//            }else {
//                rs = middle;
//                //还要再往左边再找一下，第一次中间位置不一定是最左边的位置
//                endIndex = middle - 1;
//            }
//        }
//        return rs;
//    }

}
